package com.tb.controller;

import com.github.pagehelper.IPage;
import com.tb.DTO.RequestDTO;
import com.tb.DTO.scheduleDTO;
import com.tb.DTO.schedulePageQueryDTO;
import com.tb.Service.TbService;
import com.tb.entity.schedule;
import com.tb.result.PageResult;
import com.tb.result.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;

@RestController
@RequestMapping("/schedule")
@Slf4j
@Api("日程管理")
@CrossOrigin("*")
public class tbController {
    @Autowired
    private TbService tbService;

    // 时间格式化器
    private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

    @PostMapping("/add")
    @ApiOperation("添加日程")
    public Result add(@RequestBody scheduleDTO scheduleDTO) {

        try {
            // 验证 startTime 和 endTime 格式
            if (scheduleDTO.getStartTime() == null || scheduleDTO.getEndTime() == null) {
                return Result.error("开始时间和结束时间不能为空");
            }

            // 这里可以手动格式化和验证传递的时间
            String formattedStartTime = scheduleDTO.getStartTime().format(formatter);
            String formattedEndTime = scheduleDTO.getEndTime().format(formatter);

            log.info("添加日程 startTime:{} endTime:{}", formattedStartTime, formattedEndTime);

            // 调用服务层添加日程
            tbService.add(scheduleDTO);
            return Result.success();

        } catch (Exception e) {
            log.error("添加日程失败", e);
            return Result.error("时间格式无效，正确格式为：yyyy-MM-dd HH:mm:ss");
        }
    }

    @GetMapping("/{id}")
    @ApiOperation("根据id查询日程")
    public Result get(@PathVariable("id") Long id) {
        log.info("根据id查询日程{}", id);
        return Result.success(tbService.get(id));
    }

    @PutMapping("/{id}")
    @ApiOperation("修改日程")
    public Result update(@RequestBody scheduleDTO scheduleDTO) {
        log.info("修改日程{}", scheduleDTO);
        try {
            // 调用 Service 层的 update 方法
            tbService.update(scheduleDTO);
            return Result.success();
        } catch (DateTimeParseException e) {
            return Result.error("时间格式无效，正确格式为：yyyy-MM-dd HH:mm:ss或者yyyy年MM月dd日 HH:mm:ss");
        } catch (Exception e) {
            log.error("修改日程失败", e);
            return Result.error("修改日程失败，请检查输入格式");
        }
    }

    // 单个删除日程
    @DeleteMapping("/{id}")
    @ApiOperation("删除单个日程")
    public Result deleteOne(@PathVariable("id") Long id) {
        log.info("删除单个日程{}", id);
        boolean result = tbService.deleteByOne(id);
        if (result) {
            return Result.success();
        } else {
            return Result.error("删除失败");
        }
    }

    // 删除多个日程
    @DeleteMapping("/batch")
    @ApiOperation("删除多个日程")
    public Result deletBatch(@RequestBody Long[] ids) {
        log.info("删除多个日程{}", ids);
        boolean result = tbService.deleteByBatch(ids);
        if (result) {
            return Result.success();
        } else {
            return Result.error("删除失败");
        }
    }

    // 修改日程状态
    @PutMapping("/status")
    @ApiOperation("修改日程状态")
    public Result updateStatus(@RequestBody RequestDTO requestDTO) {
        log.info("修改日程状态{}", requestDTO);
        boolean result = tbService.updateStutes(requestDTO.getId(), requestDTO.getStatus());
        if (result) {
            return Result.success();
        } else {
            return Result.error("修改失败");
        }
    }

    // 分页查询
    @GetMapping("/list")
    @ApiOperation("分页查询")
    public Result<PageResult> page(@RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "10") Integer pageSize,
            String title,
            Integer type, // 日程类型
            Integer priority, // 日程优先级
            Integer status, // 日程的状态
            @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate startTime, // 起始时间
            @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate endTime // 终止时间
    ) {
        log.info("分页查询参数：{},{},{},{},{},{},{}", page, title, type, priority, status, startTime, endTime);
        PageResult pageResult = tbService.pageQuery(page, pageSize, title, type, priority, status, startTime, endTime);
        return Result.success(pageResult);
    }
}
